package p1.demo03;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//一会会在这个类中动态生成代理类,在动态代理中,这个类叫做实现了InvocationHandler的处理程序
public class proxyinvocationHandler implements InvocationHandler {

    //被代理的接口
    private Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    //生成并得到代理类
    public Object getProxy(){
        /*三个参数的分析
       1. 将类加载到类加载器中,固定写法 : this.getClass().getClassLoader()
       2. 代表我们要实现的接口是哪一个接口. 这里就是"rent"是一个变量,其他地方都是固定写法
       3. this就是代表InvocationHandler
         */
      return  Proxy.newProxyInstance(this.getClass().getClassLoader(),
              rent.getClass().getInterfaces(),
              this);
    }




    //处理代理实例并返回结果,和拓展方法的执行都在"invoke"中
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        seehouse();
         // 动态代理的本质就是使用反射机制实现
        Object result = method.invoke(rent, objects);//参数1是指被代理的接口中的方法
        fare();
        return result;
    }

    //中介带你去看房子
    public void seehouse(){
        System.out.println("中介带你看房子");
    }

    //交中介费
    public void fare(){
        System.out.println("交中介费");
    }
}
